"""
   ┌─┐       ┌─┐ + +
┌──┘ ┴───────┘ ┴──┐++
│                 │
│       ───       │++ + + +
███████───███████ │+
│                 │+
│       ─┴─       │
│                 │
└───┐         ┌───┘
    │         │
    │         │   + +
    │         │
    │         └──────────────┐
    │                        │
    │                        ├─┐
    │                        ┌─┘
    │                        │
    └─┐  ┐  ┌───────┬──┐  ┌──┘  + + + +
      │ ─┤ ─┤       │ ─┤ ─┤
      └──┴──┘       └──┴──┘  + + + +
             神兽保佑
            代码无BUG!
"""
import time

import redis  # 导入redis模块，通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库

# r = redis.Redis(host='localhost', port=6379, decode_responses=True)
# host是redis主机，需要redis服务端和客户端都启动 redis默认端口是6379
# r.set('name', 'linyue')   # key是"foo" value是"bar" 将键值对存入redis缓存
# print(r['name'])
# print(r.get('name'))  # 取出键name对应的值
# print(type(r.get('name')))
# 存在返回none 不作修改
# print(r.set("name","liyabo",nx=True))
# 存在返回true 并修改，不存在返回none
# print(r.set("name","liyabo",xx=True))

# ----------自增-----------
# r.set("foo", 123)
# r.incr("foo", amount=1)
# print(r.get("foo"))

# redis 连接池
pool = redis.ConnectionPool(host="127.0.0.1", port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
# r.set("gender", "male")
# print(r.get("gender"))

# ----------------------------redis 基础命令-------------------------
# 设置年龄为24,ex；三秒后过期,px:3毫秒后过期
# r.set("age", "24", ex=3)
# r.set("age", "24", ex=3)
# print(r.get("age"))
# time.sleep(4)
# print(r.get("age"))

# nx为True:不存在这执行set操作，存在返回none，新建
# r.set("age", "26", nx=True)  # 不执行库中已有年龄25
# r.setnx("age", "26")  # 不执行库中已有年龄25,同理
# print(r.get("age"))

# xx为True：存在则执行set操作，更新
# r.set("age", "26", xx=True)  # 更新值为26
# print(r.get("age"))

# setex :(name, time, value)  time 为过期时间 单位s    秒
# psetex :(name, time——ms, value)  time 为过期时间 单位ms  毫秒
# r.setex("ldh", 3, "刘德华")
# print(r.get("ldh"))
# time.sleep(4)
# print(r.get("ldh")) # 三秒后值为None

# mset 批量添加值    mget:批量获取
# r.mset({"k1": "v1", "k2": "v2"})
# print(r.mget("k1", "k2"))

# getset 设置新值，并获取旧值
# print(r.getset("k1", "v3"))
# print(r.get("k1"))

# getrange: 获取子序列，字节操作，非字符
# r.set("cn_name", "满心欢喜")  # 汉字
# print(r.getrange("cn_name", 3, 5))  # 输出：满 索引0-2，三个字节，一个汉字占三个字节  1个字母一个字节 每个字节8bit
# print(r.getrange("cn_name", 0, -1))  # 获取所有的字节

# r.set("en_name", "huanxi")
# print(r.getrange("en_name", 0, 2))  # 输出：hua 索引0-2，1个字母一个字节 每个字节8bit
# print(r.getrange("en_name", 0, -1))  # 输出：hua 索引0-2，1个字母一个字节 每个字节8bit

# setrange(name, offset, value)： 修改字符串内容，从指定的位置开始向后替换
# r.setrange("en_name", 1, "uuu")
# print(r.get("en_name"))

# setbit(name, offset, value)  对name对应值的二进制表示的位进行操作
# print(r.get("en_name"))
# r.setbit("en_name", 5, 0)
# print(r.get("en_name"))

# -------------------------redis hash 基础命令-----------------------

# hset(name, key, value): 单个添加--修改  （存在则修改，反之添加）
# name 对应hash设置的键值对
# key ，name对应hash中的key
# value name对应hash 中的value
# 注：
# hsetnx(name, key, value),当name对应的hash中不存在当前key时则创建（相当于添加）
r.hset("hash1", "k1", "v1")
r.hset("hash1", "k2", "v2")
print(r.hget("hash1", "k1"))
print(r.hget("hash1", "k2"))
print(r.hgetall("hash1"))
